 	
 	public enum Sequential {
 		
-		public typealias SizeToFrame = (CGSize) -> CGRect
-		public typealias PreviousFrameAndSizeToFrame = (_ previousFrame: CGRect, _ boundSize: CGSize) -> CGRect
-		
-		public typealias FitSizeBoundSizeToFrame = (_ fitSize: CGSize, _ boundSize: CGSize) -> CGRect
-		public typealias PreviousFrameFitSizeAndSizeToFrame = (_ previousFrame: CGRect, _ fitSize: CGSize, _ boundSize: CGSize) -> CGRect
-		
-		case horizontallyEqualSizedAbsolute(initial: CGRect, margin: CGFloat)
-		case verticallyEqualSizedAbsolute(initial: CGRect, margin: CGFloat)
-		
-		case horizontallyEqualSizedRelative(initial: CGRect, margin: CGFloat)
-		case verticallyEqualSizedRelative(initial: CGRect, margin: CGFloat)
+		public typealias SizeToFrame = (CGSize) -> LayoutFrame
+		public typealias PreviousFrameAndSizeToFrame = (_ previousFrame: CGRect, _ boundSize: CGSize) -> LayoutFrame
+		
+		public typealias FitSizeBoundSizeToFrame = (_ fitSize: CGSize, _ boundSize: CGSize) -> LayoutFrame
+		public typealias PreviousFrameFitSizeAndSizeToFrame = (_ previousFrame: CGRect, _ fitSize: CGSize, _ boundSize: CGSize) -> LayoutFrame
+		
+		case horizontallyEqualSizedAbsolute(initial: LayoutFrame, margin: CGFloat)
+		case verticallyEqualSizedAbsolute(initial: LayoutFrame, margin: CGFloat)
+		
+		case horizontallyEqualSizedRelative(initial: LayoutFrame, margin: CGFloat)
+		case verticallyEqualSizedRelative(initial: LayoutFrame, margin: CGFloat)
 		
 		case customByFrame(initial: SizeToFrame, rest: PreviousFrameAndSizeToFrame)
 		

	
	public enum Matrical {
		
		public typealias SizeToFrame = (CGSize) -> CGRect
		public typealias PreviousColFrameAndSizeToFrame = (_ previousColFrame: CGRect, _ boundSize: CGSize) -> CGRect
		public typealias PreviousRowFrameAndSizeToFrame = (_ previousRowFrame: CGRect, _ boundSize: CGSize) -> CGRect
		public typealias PreviousRowColFrameAndSizeToFrame = (_ previousRowFrame: CGRect, _ previousColFrame: CGRect, _ boundSize: CGSize) -> CGRect
		
		public typealias FitSizeBoundSizeToFrame = (_ fitSize: CGSize, _ boundSize: CGSize) -> CGRect
		public typealias PreviousColFrameFitSizeAndSizeToFrame = (_ previousColFrame: CGRect, _ fitSize: CGSize, _ boundSize: CGSize) -> CGRect
		public typealias PreviousRowFrameFitSizeAndSizeToFrame = (_ previousRowFrame: CGRect, _ fitSize: CGSize, _ boundSize: CGSize) -> CGRect
		public typealias PreviousRowColFrameFitSizeAndSizeToFrame = (_ previousRowFrame: CGRect, _ previousColFrame: CGRect, _ fitSize: CGSize, _ boundSize: CGSize) -> CGRect
		
		case horizontallyEqualSizedAbsolute(initial: CGRect, margin: CGVector)
		case verticallyEqualSizedAbsolute(initial: CGRect, margin: CGVector)
		
		case horizontallyEqualSizedRelative(initial: CGRect, margin: CGVector)
		case verticallyEqualSizedRelative(initial: CGRect, margin: CGVector)
		
		case customByFrame(initial: SizeToFrame, firstInCol: PreviousColFrameAndSizeToFrame, firstInRow: PreviousRowFrameAndSizeToFrame, rest: PreviousRowColFrameAndSizeToFrame)
		


extension LayoutPosition {
	
	public static func makeAbsolute(initialFrame: LayoutFrame, margin: CGFloat, direction: LayoutPosition.Sequential.Direction) -> LayoutPosition {
		switch direction {
		case .horizontal:
			return .sequential(.horizontallyEqualSizedAbsolute(initial: initialFrame, margin: margin))
			
		case .vertical:
			return .sequential(.verticallyEqualSizedAbsolute(initial: initialFrame, margin: margin))
		}
	}
	
	public static func makeAbsolute(initialFrame: CGRect, margin: CGFloat, direction: LayoutPosition.Sequential.Direction) -> LayoutPosition {
		let layoutFrame = LayoutFrame(reference: .topLeft, origin: initialFrame.origin, size: initialFrame.size)
		return makeAbsolute(initialFrame: layoutFrame, margin: margin, direction: direction)
	}
	
	public static func makeRelative(initialFrame: LayoutFrame, margin: CGFloat, direction: LayoutPosition.Sequential.Direction) -> LayoutPosition {
		switch direction {
		case .horizontal:
			return .sequential(.horizontallyEqualSizedRelative(initial: initialFrame, margin: margin))
			
		case .vertical:
			return .sequential(.verticallyEqualSizedRelative(initial: initialFrame, margin: margin))
		}
	}
	
	public static func makeRelative(initialFrame: CGRect, margin: CGFloat, direction: LayoutPosition.Sequential.Direction) -> LayoutPosition {
		let layoutFrame = LayoutFrame(reference: .topLeft, origin: initialFrame.origin, size: initialFrame.size)
		return makeRelative(initialFrame: layoutFrame, margin: margin, direction: direction)
	}
	
	public static func makeCustom(initialFrame: @escaping Sequential.SizeToFrame, restFrame: @escaping Sequential.PreviousFrameAndSizeToFrame) -> LayoutPosition {
