Statically typed persistent storage solutions are far and away superior to Core 
Data.  Whether you’re looking for queries that are correct-by-construction with 
DSLs or looking for easy model construction and composability, or even just 
modularity and ease of use.  The ability to have the type system check your 
work is not antithetical to the idea of marshaling data - if anything it’s far 
more effective.  

- Begin with a protocol for serializable things to teach the framework about 
your schema:

///     decode • encode == id
public protocol Serializable {
        /// Encode a value.
        var serialize : Put<Format> { get }
        /// Decode a value.
        static var deserialize : Get<Self> { get }
}

- Provide combinators and functions attached to `Get` and `Put` to make 
[de]serializing aggregates easy.  

struct Person : Equatable {
        let age : UInt32
        let weight : UInt32
}

extension Person : Serializable {
        static var deserialize : Get<Person> {
                return Get.zip(
                        UInt32.deserialize,
                ).map(Person.init)
        }

        var serialize : Put<Person> {
                return self.age.serialize
                        .then(self.weight.serialize)
        }
}

- Select a backend

public struct SqlBackend : Backend {
                func prepare(statement : String) -> Statement { }
        func insert<Entity : Serializable>(_ entity : Entity) -> Result { }
        // etc.
}

- Maybe put a little DSL on top if you’re feeling cheeky

let p : SQLQuery<[Person]> =
        select <|
        from { p in
                (where_ <|  exists <|
                        from { (p : Person) -> SQLQuery<()> in
                                where_(val(p.age) <= val(18))
                        }).then(SQLQuery<Person>.pure(p))
}

- Serve immediately

> On Sep 27, 2016, at 12:29 PM, Ricardo Parada <[email protected]> wrote:
> 
> 
>> On Sep 26, 2016, at 5:32 PM, Robert Widmann via swift-evolution 
>> <[email protected] <mailto:[email protected]>> wrote:
>> 
>> No, and I think moving towards a more dynamic Swift now without 
>> as-of-yet-seen significant justification would be a mistake.  Swift should 
>> be as static as possible.  We should be making every attempt to pare down 
>> the existing runtime and quietly transition those that rely on dynamism to 
>> checked reflection (yes, that is not in fact an oxymoron).  The more the 
>> compiler knows about your program, the better it does.  Period.
>> 
> How would you implement something like Core Data in pure Swift on the server 
> where the Obj-C runtime is not available?
> 
> 

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to